package cqrtplm.util;

import cn.hutool.core.collection.CollUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class SequenceGenerator {

    private static final List<String> SEQUENCE_LIST = generate();

    private static final HashMap<String, String> NEXT_CODE_MAP = buildNextCodeMap();

    /**
     * 获取预生成的序列列表（不可修改）
     */
    public static List<String> getSequenceList() {
        if(CollUtil.isEmpty(SEQUENCE_LIST)){
            generate();
        }
        return SEQUENCE_LIST;
    }

    public static int indexOfFlowCode(String currentCode) {
        int index = SEQUENCE_LIST.indexOf(currentCode);
        if (index == -1) {
            throw new IllegalArgumentException("无效的流水码: " + currentCode);
        }
        if (index + 1 >= SEQUENCE_LIST.size()) {
            throw new IllegalStateException("已到达最大流水码");
        }
        return index;
    }

    /**
     * 传入一个两位码，返回序列中的下一个码；如果是最后一个，则返回 null
     *
     * @param currentCode 当前两位码，例如 "A2"
     * @return 下一个码，如 "A3"；无效输入或末尾则返回 null
     */
    public static String nextCodeOf(String currentCode) {
        if (currentCode == null || currentCode.length() != 2) {
            return null;
        }
        if(CollUtil.isEmpty(NEXT_CODE_MAP)){
            buildNextCodeMap();
        }
        return NEXT_CODE_MAP.get(currentCode);
    }

    /**
     * 构建映射表：每个 code -> 下一个 code（最后一个映射为 null）
     */
    private static HashMap<String, String> buildNextCodeMap() {
        HashMap<String, String> map = new HashMap<>();
        if(CollUtil.isEmpty(SEQUENCE_LIST)){
            generate();
        }
        List<String> list = SEQUENCE_LIST;
        int size = list.size();
        for (int i = 0; i < size - 1; i++) {
            map.put(list.get(i), list.get(i + 1));
        }
        // 最后一个元素没有下一个
        map.put(list.get(size - 1), null);
        return map;
    }


    /**
     * 私有方法：生成所有合法的两字符组合
     */
    private static List<String> generate() {
        List<String> codes = new ArrayList<>();
        String digits = "0123456789";
        String letters = "ABCDEFGHJKLMNPRSTUVWXYZ";
        // 1. 数字+数字 (00-99)
        for (char d1 : digits.toCharArray()) {
            for (char d2 : digits.toCharArray()) {
                codes.add("" + d1 + d2);
            }
        }
        // 2. 数字+字母 (0A-9Z)
        for (char d : digits.toCharArray()) {
            for (char l : letters.toCharArray()) {
                codes.add("" + d + l);
            }
        }
        // 3. 字母+数字 (A0-Z9)
        for (char l : letters.toCharArray()) {
            for (char d : digits.toCharArray()) {
                codes.add("" + l + d);
            }
        }
        // 4. 字母+字母 (AA-ZZ)
        for (char l1 : letters.toCharArray()) {
            for (char l2 : letters.toCharArray()) {
                codes.add("" + l1 + l2);
            }
        }
        return codes;
    }

}
